/* Copyright 203-2115 AtomWare Technology Pty Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * The flowing information must be keep 
 * BeanPropertyValueNotEmptyPredicate.java
 * wholebasic
 * 2014年5月19日下午5:17:11
 * @author 屈甲康
 * QQ285799123
 * mailto:qujiakang@gmail.com
 */

package org.jackysoft.collection.function;

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class BeanPropertyValueNotEmptyPredicate implements Predicate {


	private static final Log logger = LogFactory.getLog(BeanPropertyValueNotEmptyPredicate.class);
	private String propName;
		

	public BeanPropertyValueNotEmptyPredicate(String propName) {
		super();
		this.propName = propName;		
		if(StringUtils.isEmpty(this.propName)){
			RuntimeException er = new java.lang.IllegalStateException("propertyName or can't be empty ");
		    throw er;
		}
	}



	@Override
	public boolean evaluate(Object bean) {
		Object oval = null;
		try {
			oval = PropertyUtils.getProperty(bean, propName);
		} catch (IllegalAccessException | InvocationTargetException
				| NoSuchMethodException e) {
			logger.error(e.toString());			
		}
		if(oval!=null) {
			if(oval instanceof String){
				return StringUtils.isNotEmpty(String.class.cast(oval));
			}
			return true;
		}else{
			return false;
		}		
	}

}
